<?php

namespace app\admin\controller;

use think\Controller;
use think\Request;
use think\facade\Env;
use app\admin\model\OrderModel;
use think\facade\DB;

class PaymentController extends Controller
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        //
    }

    /**
     * 显示创建资源表单页.
     *
     * @return \think\Response
     */
    public function create()
    {
        //
    }

    /**
     * 微信支付
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        //包含支付类
        include("../vendor/wechatpay/lib/WxPay.Api.php");
     
        //接受参数
        //统一下单，WxPayUnifiedOrder中out_trade_no、body、total_fee、trade_type必填;appid、mchid、spbill_create_ip、nonce_str不需要填入
        $wxOrderData  = new \WxPayUnifiedOrder();
        $wxOrderData->SetOut_trade_no($request->post('order_num')); //设置订单号
        $wxOrderData->SetTrade_type(Env::get("TRADETYPE")); //微信支付方式
        $wxOrderData->SetBody(Env::get("BODY")); //商品描述
        $wxOrderData->SetFee_type('CNY'); //货币种类 CNY人民币
        $wxOrderData->SetTotal_fee($request->post("total")); //设置订单总价
        $wxOrderData->SetOpenid($request->post("openid")); //设置用户openid

        $wxPayConfig = new \WxPayConfig();
        $pay = \WxPayApi::unifiedOrder($wxPayConfig, $wxOrderData);
        dump($pay);
    }

    /**
     * 异步通知方法
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function notifyUrlApi()
    {
        //接收返回数据
        $xml = file_get_contents('php://input', 'r');
        dump($xml);die;
        //将服务器返回的XML数据转化为数组  
        $data = $this->toArray($xml);
        dump($data);
        //判断返回是否成功
        if (($data['return_code'] == 'SUCCESS') && ($data['result_code'] == 'SUCCESS')) {
            $result = $data;  
            //获取服务器返回的数据  
            $order_sn = $data['out_trade_no'];          // 订单单号  
            $openid = $data['openid'];                  // 付款人openID  
            $total_fee = ($data['total_fee'])/100;            // 付款金额  
            $transaction_id = $data['transaction_id'];  // 微信支付流水号  
              
            //查找订单  订单状态 0待付款1已付款 2配送当中 3订单已完成 4退款当中 5退款已完成
            $order = OrderModel::where('status', 0)->where('order_no', $order_sn)->find();
            // 判断订单是否存在
            if($order) { 
                //判断金额是否一样  
                if ($total_fee == $order['goods_total_price']) {
                    Db::startTrans();
                    try {
                        // 更新订单状态(order)
                        OrderModel::where('order_num', $order_sn)->update(['transaction_no' => $transaction_id, 'status' => 1]);
                        Db::commit();
                    }catch (Exception $e) {
                        $result = false;  
                        Db::rollback();
                    }
                }        
            }else{      // 订单不存在 
                $result = false;  
            }
        }else {
            $result = false;  
        }  

        // 返回状态给微信服务器  
        if ($result) {  
            $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';  
        }else{  
            $str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';  
        }

        echo $str;  
        return $result;  
    }

    /**
   * 将xml转为array
   * @param  string $xml xml字符串
   * @return array       转换得到的数组
   */
  public function toArray($xml) {   
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $result= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);        
    return $result;
}

    /**
     * 微信退款
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function agree(Request $request)
    {
        //包含类
        include("../vendor/wechatpay/lib/WxPay.Api.php");
        //接受参数
        //申请退款，WxPayRefund中out_trade_no(商户订单号)、transaction_id(微信生成的流水号)至少填一个
        //且out_refund_no(商户退款单号)、total_fee(订单金额)、refund_fee(退款金额)、op_user_id(商户号)为必填参数appid、mchid、spbill_create_ip、nonce_str不需要填入

        $wxOrderData  = new \WxPayRefund();
        $wxOrderData->SetOut_trade_no($request->post('order_num')); //订单号
        $wxOrderData->SetOut_refund_no(123); //商户退款单号
        $wxOrderData->SetTotal_fee(111); //订单金额
        $wxOrderData->SetRefund_fee(233); //退款金额
        $wxOrderData->SetOp_user_id(Env::get("MCHID")); //商户号
        $wxOrderData->refund_desc($request->post("refund_desc"));//退款原因
        dump($wxOrderData);die;
        $wxPayConfig = new \WxPayConfig();
        $pay = \WxPayApi::refund($wxPayConfig, $wxOrderData);
        dump($pay);
    }

    /**
     * 
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request)
    {
        //接收参数
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        //
    }
}
